package com.atguigu.controller;

import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

/**
 * @author 伟哥
 * @date 2021-06-02 9:37
 */
@Controller
public class ExceptionTestController {
    /**
     * ExceptionHandlerExceptionResolver异常解析器
     *      默认处理@ExceptionHandler（本类异常）
     *         处理@ControllerAdvice（全局异常）
     *      默认优先级第一位
     * @param i
     * @return
     */
    @RequestMapping("/handle01")
    public String handle01(@RequestParam("i")int i){
        System.out.println("handle01被调用...");
        System.out.println(10/i);// 制作【异常】
        return "success";
    }

    /**
     * ResponseStatusExceptionResolver异常解析器
     *      默认处理@ResponseStatus注解
     *      默认优先级第二位
     * @param username
     * @return
     */
    @RequestMapping("/handle02")
    public String handle02(@RequestParam("username")String username){
        if (!"admin".equals(username)){
            System.out.println("登陆失败");
            throw new UserNameNotFoundException();
        }
        System.out.println("登陆成功");
        return "success";
    }

    /**
     * DefaultHandlerExceptionResolver
     *      用来处理SpringMVC自己的异常
     *      默认优先级第三位
     *
     * 限定请求方式为POST，让SpringMVC出现异常
     * @return
     */
    @RequestMapping(value = "/handle03",method = RequestMethod.POST)
    public String handle03(){
        return "success";
    }

    /**
     * SimpleMappingExceptionResolver通过配置，处理异常
     *      默认优先级第四位
     *
     * 产生一个空指针异常，交由SpringMVC的配置文件中，配置的SimpleMappingExceptionResolver处理
     * @return
     */
    @RequestMapping("/handle04")
    public String handle04(){
        System.out.println("handle04被调用");

        //产生空指针异常
        String string = null;
        string.toLowerCase();
        return "success";
    }

    /**
     * 注解：@ExceptionHandler
     *      告诉SpringMVC这个方法，专门处理这个类发生的所有异常
     *
     *      1、属性：异常的class类型
     *          单一异常：@ExceptionHandler(ArithmeticException.class)数学异常
     *          多异常：@ExceptionHandler(value = { ArithmeticException.class, NullPointerException.class})
     *          简单省事：@ExceptionHandler(Exception.class)
     *
     *      2、获取异常信息：
     *          在方法入参处，写Exception e用来接收发生的异常，
     *          必须能容下发生的异常信息，也就是异常信息的父类Exception，而且SpringMVC只认Exception
     *
     *      3、携带异常信息，给页面：
     *          方法入参不能携带Model
     *          所以，可以返回ModelAndView
     *      4、如果有多个标注@ExceptionHandler都可以处理异常，【精确优先】
     *      5、全局处理异常 和 本类处理异常：【本类处理异常优先。】

    @ExceptionHandler(value = { ArithmeticException.class})
    public ModelAndView handleException01(Exception exception ){
        System.out.println("handleException01被调用..." + exception);
        ModelAndView myError = new ModelAndView("myError");
        myError.addObject("ex",exception);

        // 视图解析器拼串
        return myError;
    }
    //处理空指针，和数学异常
    @ExceptionHandler(value = { ArithmeticException.class,NullPointerException.class})
    public ModelAndView handleException02(Exception exception ){
        System.out.println("handleException02被调用..." + exception);
        ModelAndView myError = new ModelAndView("myError");
        myError.addObject("ex",exception);

        // 视图解析器拼串
        return myError;
    }

    //通用处理异常
    @ExceptionHandler(value = { Exception.class})
    public ModelAndView handleException03(Exception exception ){
        System.out.println("handleException03被调用..." + exception);
        ModelAndView myError = new ModelAndView("myError");
        myError.addObject("ex",exception);

         // 视图解析器拼串
        return myError;
    }
     */
}
